
class Observer{
    constructor(data){
        this.walk(data)
    }
    walk(data){
        Object.keys(data).forEach(key=>defineReactive(data,key,data[key]))
    }
}

export function defineReactive(target,key,value){
    // 对所有对象进行属性劫持,递归操作
    observe(value)
    Object.defineProperty(target,key,{
        get(){
            console.log('用户取值')
            return value
        },
        set(newValue){
            console.log('用户设置值')
            // 修改的时候会执行set
            if(newValue===value) return
            value=newValue
        }
    })
}

export function observe(data){
    // debugger
    // console.log(data)
    if(typeof data!=='object'|| data===null){
        return;// 只对对象进行劫持
    }
     // 如果一个对象被劫持过了，那就不需要再被劫持了 (要判断一个对象是否被劫持过，可以增添一个实例，用实例来判断是否被劫持过)
     return new Observer(data);
}